package TCP;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * 服务器线程类，用于处理客户端的连接和通信
 */
public class Day09_Server_Thread_outclass extends Thread{
    private Socket socket;

    /**
     * 构造函数，初始化一个服务器线程
     * @param socket 客户端的Socket连接
     */
    public Day09_Server_Thread_outclass(Socket socket) {
        this.socket = socket;
    }

    /**
     * 线程的运行方法，用于处理客户端的请求
     */
    @Override
    public void run() {
        try {
            // 获取输入流，用于读取客户端发送的数据
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            while (true) {
                // 读取客户端发送的消息
                String info = bufferedReader.readLine();
                // 打印收到的消息，并标识来自哪个客户端
                System.out.println("服务器收到的数据为："+info+" 该信息来自："+socket.getRemoteSocketAddress());

                // 将收到的消息发送给所有其他在线客户端
                sendMessageToAll(info);
            }
        } catch (IOException e) {
            // 捕获异常，当客户端断开连接时，从在线客户端列表中移除该客户端
            System.out.println(socket.getRemoteSocketAddress()+"离线了");
            Day09_Server_Thread.onLineSockets.remove(socket);
        }
    }

    /**
     * 将消息发送给所有在线的客户端
     * @param info 要发送的消息内容
     * @throws IOException 如果发送数据过程中出现IO异常
     */
    private void sendMessageToAll(String info) throws IOException {
        // 遍历在线客户端列表，将消息发送给每个在线客户端
        for (Socket lineSocket :
                Day09_Server_Thread.onLineSockets) {
            OutputStream outputStream = lineSocket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
            PrintWriter printWriter = new PrintWriter(dataOutputStream, true);
            // 实际发送消息
            printWriter.println(info);
        }
    }
}
